/**
 * 
 */
package org.yelongframework.json.gson.adapter;

import java.io.IOException;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

/**
 * java.lang.Integer类型适配器。 对于Integer的属性在序列化或者反序列化时，遇到“空”值时使用填补值来返回
 * 
 * @since 1.0.0
 */
public class IntegerTypeAdapter extends TypeAdapter<Integer> {

	/** 序列化null值填补 */
	private String serializationNullPadding;

	/** 反序列化null值填补 */
	private Integer deserializationNullPadding;

	// ==================================================构造器==================================================

	public IntegerTypeAdapter() {
		this("", null);
	}

	/**
	 * @param serializationNullPadding   序列化null值填补
	 *                                   当String类型进行转换json时，如果这个属性值为null则使用{@link #serializationNullPadding}来替换
	 * @param deserializationNullPadding 反序列化null值填补 反序列化null值填补
	 *                                   当json进行转换String类型时，如果这个属性值为null则使用{@link #deserializationNullPadding}来替换
	 */
	public IntegerTypeAdapter(String serializationNullPadding, Integer deserializationNullPadding) {
		this.serializationNullPadding = serializationNullPadding;
		this.deserializationNullPadding = deserializationNullPadding;
	}

	// ==================================================序列化null值填补==================================================

	/**
	 * @return 序列化null值填补
	 */
	public String getSerializationNullPadding() {
		return serializationNullPadding;
	}

	/**
	 * @param serializationNullPadding 序列化null值填补
	 * @return this
	 */
	public IntegerTypeAdapter setSerializationNullPadding(String serializationNullPadding) {
		this.serializationNullPadding = serializationNullPadding;
		return this;
	}

	// ==================================================反序列化null值填补==================================================

	/**
	 * @return 反序列化null值填补
	 */
	public Integer getDeserializationNullPadding() {
		return deserializationNullPadding;
	}

	/**
	 * @param deserializationNullPadding 反序列化null值填补
	 * @return this
	 */
	public IntegerTypeAdapter setDeserializationNullPadding(Integer deserializationNullPadding) {
		this.deserializationNullPadding = deserializationNullPadding;
		return this;
	}

	// ==================================================写==================================================

	@Override
	public void write(JsonWriter out, Integer value) throws IOException {
		if (value == null) {
			out.value(serializationNullPadding);
			return;
		}
		out.value(value);
	}

	// ==================================================读==================================================

	@Override
	public Integer read(JsonReader in) throws IOException {
		if (in.peek() == JsonToken.NULL) {
			in.nextNull();
			return deserializationNullPadding;
		}
		return in.nextInt();
	}

}
